perm filename CHAT.MID[NET,MRC]2 blob sn#589436 filedate 1981-05-22 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00007 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00002 00002	TITLE CHAT
C00003 00003	INBUFH OUTBFH TTYBFH GOTINT RFCBLK HOST SMRBLK RMRBLK INPBLK CRLF BEEPC
C00005 00004	CHAT
C00006 00005	CHAT1 CHAT2
C00008 00006	LOOP TTILUP
C00010 00007	TTIDUN TTIDN1 TTIDN2 NTICHR FLUSH CLOSED
C00013 ENDMK
C⊗;
TITLE CHAT
SUBTTL Definitions

; Mark Crispin, SU-AI, February '81

; Prototype Ethernet user TELNET

; AC definitions

A=1

; System bit definitions

INTTTY==020000,,		; TTY input
INTCLK==000200,,		; clock interrupts
INTIMS==000020,,		; closed interrupt
INTINP==000010,,		; input interrupt
IODTER==100000			; Time out
IOBKTL==040000			; Mark seen
IODEND==020000			; End seen
BSACT== 000020			; activate on BS
SPCBRK==000100,,		; special activation mode
DISLIN==400000,,		; III
DMLIN== 040000,,		; DM
DDDLIN==020000,,		; DD
INTBTS==INTTTY\INTCLK\INTINP\INTIMS
;INBUFH OUTBFH TTYBFH GOTINT RFCBLK HOST SMRBLK RMRBLK INPBLK CRLF BEEPC

SUBTTL Data area

INBUFH:	BLOCK 3			; input buffer
OUTBFH:	BLOCK 3			; output buffer
TTYBFH:	BLOCK 3			; TTY buffer header
GOTINT:	BLOCK 1			; -1 → got an interrupt

RFCBLK:	0			; connect to remote host
	0			; status word
	1			; socket number (1 for TELNET)
HOST:	0			; host

SMRBLK:	2			; send Mark
	0			; status word
	6			; Timing Mark Reply

RMRBLK:	3			; read last Mark
	0			; status word
	0			; Mark type returned here

INPBLK:	4			; skip if input available
	0			; status word

CRLF:	ASCIZ/
/

BEEPC:	-1			; assume beeping for default
;CHAT

SUBTTL Start of program

CHAT:	CAI
	RESET			; flush all I/O
	OUTSTR [ASCIZ/Host: /]
	SETZ A,
	INCHWL
	CAIN "?
	 JRST HELP
	CAIE "I			; IFS?
	 CAIN "i
	  MOVEI A,200
	CAIE "D			; Diablo?
	 CAIN "d
	  MOVEI A,301
	CAIE "H			; St Helens?
	 CAIN "h
	  MOVEI A,307
	CAIE "S			; Shasta or SAIL?
	 CAIN "s
	  CAIA
	   JRST CHAT0
	INCHWL
	CAIE "H
	 CAIN "h
	  MOVEI A,300
	CAIE "A
	 CAIN "a
	  MOVEI A,302
CHAT0:	JUMPN A,CHAT1
	OUTSTR [ASCIZ/Invalid host name
/]
HELP:	OUTSTR [ASCIZ/Legal host names:
DIABLO	HELENS	IFS	SAIL	SHASTA
/]
	CLRBFI
	JRST CHAT
;CHAT1 CHAT2

CHAT1:	INCHWL
	CAIE ↑J
	 CAIN 175
	  CAIA
	   JRST CHAT1
	MOVEM A,HOST
	HRROI [003000,,]
	TTYSET				; get line characteristics
	CAMN [-1]
	 EXIT				; how can I work if detached?
	TLNE (DISLIN\DMLIN\DDDLIN)	; display?
	 JRST CHAT2
	HRROI [001000,,(SPCBRK)]
	TTYSET
CHAT2:	SETACT [[	777777,,777777; activate on everything
			777777,,777777; just set it up for when we need it
			777777,,777777
			777777,,600000\BSACT]]
	OUTSTR [ASCIZ/ Trying... /]
	INIT
	 SIXBIT/PUP/
	 OUTBFH,,INBUFH
	 JRST [	OUTSTR [ASCIZ/Device PUP not available.  Try again later./]
		EXIT]
	INIT 1,
	 SIXBIT/TTY/
	 TTYBFH,,
	 JRST 4,CHAT
	MOVEI 8.		; change byte size in buffer header
	DPB [300600,,INBUFH+1]
	DPB [300600,,OUTBFH+1]
	INBUF
	OUTBUF
	OUTBUF 1,
	MTAPE RFCBLK
	 JRST [	OUTSTR [ASCIZ/Host dead/]
		EXIT]
	OUTSTR [ASCIZ/Open
/]
	PTJOBX [0 ? 3]
	LOCK
	SETZM GOTINT
	MOVEI [	SETOM GOTINT	; got an interrupt
		DISMIS]		; set up interrupt server
	MOVEM JOBAPR
	CLKINT 30.*60.		; keep alive counter
	MOVSI (INTBTS)
	INTENB			; enable interrupts
;	JRST LOOP
;LOOP TTILUP

LOOP:	SKIPN GOTINT		; got an interrupt?
	 IMSTW [INTBTS]		; wait for an interrupt to happen
	INTMSK [0]		; mask off interrupts
	SETZM GOTINT
TTILUP:	INCHSL			; get a byte from the TTY
	 JRST TTIDUN		; nothing, try input from the network
	CAIN ↑M			; if a CR,
	 INCHRW A		; flush the LF right after it
	CAIN 175		; ALT
	 MOVEI 33
	CAIN 176		; }
	 MOVEI 175
	CAIN 32			; ~
	 MOVEI 176
	CAIE 600\"L		; CONTROL-META-L is character mode
	 CAIN 600\"l
	  JRST [HRROI [001000,,(SPCBRK)]
		TTYSET
		JRST TTILUP]
	CAIE 400\"L		; META-L is line mode
	 CAIN 400\"l
	  JRST [HRROI [002000,,(SPCBRK)]
		TTYSET
		JRST TTILUP]
	CAIE 600\"Q		; CONTROL-META-Q exits
	 CAIN 600\"q
	  JRST FLUSH
	CAIE 400\"Q		; so does META-Q
	 CAIN 400\"q
	  JRST FLUSH
	CAIE 600\"G		; CONTROL-META-G
	 CAIN 600\"g
	  JRST [SETZM BEEPC	; disable beeping
		JRST TTILUP]
	CAIE 400\"G		; META-G
	 CAIN 400\"g
	  JRST [SETOM BEEPC	; enable beeping
		JRST TTILUP]
	ANDI 377		; turn off META bit
	TRZE 200		; CONTROL set?
	 ANDI 37
	SOSG OUTBFH+2		; space in buffer?
	 OUT
	  CAIA
	   JRST TTIDUN
	IDPB OUTBFH+1
	JRST TTILUP
;TTIDUN TTIDN1 TTIDN2 NTICHR FLUSH CLOSED

TTIDUN:	OUTPUT			; flush the output side of things
TTIDN1:	SOSLE INBUFH+2		; data available?
	 JRST NTICHR
	HRRZ A,INBUFH
	HRRZ A,(A)
	SKIPGE (A)		; anything in further buffers?
	 JRST TTIDN2
	MTAPE INPBLK		; no - new packet available?
	 JRST [	OUTPUT 1,
		STATZ IODEND
		 JRST CLOSED
		JRST LOOP]
TTIDN2:	IN			; yes - get it
	 JRST NTICHR
	GETSTS A
	TRZE A,IODEND\IODTER	; End seen?
	 JRST CLOSED
	TRZN A,IOBKTL		; Mark seen?
	 JRST 4,.-1
	SETSTS (A)		; yes, clear error status
	MTAPE RMRBLK
	 TRN
	MOVE RMRBLK+2		; get Mark type
;;	CAIN 1			; Data Mark?
;;	 AOS NTOINP
	CAIE 5			; Timing Mark?
	 JRST TTIDN1		; something random
	MTAPE SMRBLK		; yes, send Timing Mark Reply
	 JRST CLOSED
	JRST TTIDN1

NTICHR:	ILDB INBUFH+1
;	CAIN ↑G
;	 JRST [	SETO
;		BEEP
;		JRST TTIDN1]

	movni a,1
	skipe beepc		;skip if not beeping π today
	caie 0,↑G		;skip if need to beep
	caia
	beep a,
	CAIN 176		; ~
	 MOVEI 32
	CAIN 175		; }
	 MOVEI 176
	CAIN 33			; ALT
	 MOVEI 175
	SOSG TTYBFH+2		; output character to TTY
	 OUTPUT 1,
	IDPB TTYBFH+1
	JRST TTIDN1

FLUSH:	RELEASE			; flush connection
CLOSED:	OUTPUT 1,		; flush TTY buffer
	OUTSTR [ASCIZ/
Connection closed
/]
	EXIT

END CHAT